package dao;

import domain.EccezionePrecondizioni;
import domain.EccezioneUpdater;
import domain.Root;
import domain.TipoLinkIn;
import java.sql.*;

public class RootDAO {
    private static final String INSERT_ROOT_SQL = "INSERT INTO root (path) VALUES(?)";
    private static final String SELECT_ROOT_SQL = "SELECT path FROM root WHERE id_root = ?";
    private static final String UPDATE_ROOT_SQL = "UPDATE root SET path = ? WHERE id_root = ?";
    private static final String DELETE_ROOT_SQL = "DELETE FROM root WHERE id_root = ?";
    private static final String INSERT_LINK_IN = "INSERT INTO in (root, file) VALUES (?,?)";
    private static final String DELETE_LINK_IN = "DELETE FROM in WHERE file = ?";

    private RootDAO(){}
    public static void create(Root aThis) throws EccezioneUpdater {
        Connection con = null;
        PreparedStatement st = null;
        try {
            con = ConnectionManager.getConnection();
            st = con.prepareStatement(INSERT_ROOT_SQL, Statement.RETURN_GENERATED_KEYS);
            st.setString(1, aThis.getPath());
            st.executeUpdate();

            ResultSet rs = st.getGeneratedKeys();
            if (rs.next()) {
                int risultato = rs.getInt(1);
                aThis.setId_root(risultato);
            }
        } catch (ClassNotFoundException ex) {
            throw new EccezioneUpdater("Impossibile caricare il driver per connettersi al database");
        } catch (SQLException ex) {
            throw new EccezioneUpdater(ex.getMessage());
        } finally{
            try {
                if(con != null)
                    con.close();
                if(st != null)
                    st.close();
            } catch (SQLException ex) {
                
            }
        }
    }

    public static void read(Root aThis) throws EccezioneUpdater {
        Connection con = null;
        PreparedStatement st = null;
        try {
            con = ConnectionManager.getConnection();
            st = con.prepareStatement(SELECT_ROOT_SQL);
            st.setInt(1, aThis.getId_root());
            ResultSet rs = st.executeQuery();

            if (rs.next()) {
                aThis.setPath(rs.getString("path"));
            }
        } catch (ClassNotFoundException ex) {
            throw new EccezioneUpdater("Impossibile caricare il driver per connettersi al database");
        } catch (SQLException ex) {
            throw new EccezioneUpdater(ex.getMessage());
        } finally{
            try {
                if(con != null)
                    con.close();
                if(st != null)
                    st.close();
            } catch (SQLException ex) {
                
            }
        }
    }

    public static void update(Root aThis) throws EccezioneUpdater {
        Connection con = null;
        PreparedStatement st = null;
        try {
            con = ConnectionManager.getConnection();
            st = con.prepareStatement(UPDATE_ROOT_SQL);
            st.setString(1, aThis.getPath());
            st.setInt(2, aThis.getId_root());
            st.executeUpdate();
        } catch (ClassNotFoundException ex) {
            throw new EccezioneUpdater("Impossibile caricare il driver per connettersi al database");
        } catch (SQLException ex) {
            throw new EccezioneUpdater(ex.getMessage());
        } finally{
            try {
                if(con != null)
                    con.close();
                if(st != null)
                    st.close();
            } catch (SQLException ex) {
                
            }
        }
    }

    public static void delete(Root aThis) throws EccezioneUpdater {
        Connection con = null;
        PreparedStatement st = null;
        try {
            con = ConnectionManager.getConnection();
            st = con.prepareStatement(DELETE_ROOT_SQL);
            st.setInt(1, aThis.getId_root());
            st.executeUpdate();
            Statement stat = con.createStatement();
            stat.execute("DELETE FROM file WHERE id_file NOT IN(SELECT file FROM contained_in)");
        } catch (ClassNotFoundException ex) {
            throw new EccezioneUpdater("Impossibile caricare il driver per connettersi al database");
        } catch (SQLException ex) {
            throw new EccezioneUpdater(ex.getMessage());
        } finally{
            try {
                if(con != null)
                    con.close();
                if(st != null)
                    st.close();
            } catch (SQLException ex) {}
        }
    }

    public static void createLink(TipoLinkIn link) throws EccezioneUpdater, EccezionePrecondizioni {
        if(link != null && link.getRoot() != null && link.getFile() != null){
            Connection con = null;
            PreparedStatement st = null;
            try {
                con = ConnectionManager.getConnection();
                st = con.prepareStatement(INSERT_LINK_IN);
                st.setInt(1, link.getRoot().getId_root());
                st.setInt(2, link.getFile().getId_file());
                st.executeUpdate();
            } catch (ClassNotFoundException ex) {
                throw new EccezioneUpdater("Impossibile caricare il driver per connettersi al database");
            } catch (SQLException ex) {
               throw new EccezioneUpdater(ex.getMessage());
            } finally{
                try {
                    if(con != null)
                        con.close();
                    if(st != null)
                        st.close();
                } catch (SQLException ex) {}
            }
        } else throw new EccezionePrecondizioni("Link non inizializzato");
    }

    public static void deleteLink(TipoLinkIn link) throws EccezioneUpdater, EccezionePrecondizioni {
        if(link != null && link.getRoot() != null && link.getFile() != null){
            Connection con = null;
            PreparedStatement st = null;
            try {
                con = ConnectionManager.getConnection();
                st = con.prepareStatement(DELETE_LINK_IN);
                st.setInt(1, link.getFile().getId_file());
                st.executeUpdate();
            } catch (ClassNotFoundException ex) {
                throw new EccezioneUpdater("Impossibile caricare il driver per connettersi al database");
            } catch (SQLException ex) {
               throw new EccezioneUpdater(ex.getMessage());
            } finally{
                try {
                    if(con != null)
                        con.close();
                    if(st != null)
                        st.close();
                } catch (SQLException ex) {}
            }
        } else throw new EccezionePrecondizioni("Link non inizializzato");
    }
    
}
